#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
任务完成率影响因素分析主程序

版本: v1.1.1
日期: 2023-11-22
"""

import os
import sys
import subprocess
import tensorflow as tf
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler

def check_dependencies():
    """检查依赖项是否已安装"""
    try:
        import tensorflow as tf
        import pandas as pd
        import numpy as np
        import matplotlib.pyplot as plt
        import seaborn as sns
        from sklearn.model_selection import train_test_split
        from sklearn.preprocessing import StandardScaler
        from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
        from sklearn.ensemble import RandomForestRegressor
        print("所有依赖项已安装")
        return True
    except ImportError as e:
        print(f"缺少依赖项: {e}")
        print("请运行: pip install tensorflow pandas numpy matplotlib seaborn scikit-learn")
        return False

def run_analysis():
    """运行完整的分析过程"""
    print("\n" + "="*50)
    print("开始任务完成率影响因素分析")
    print("="*50)
    
    # 确保输出目录存在
    os.makedirs('output', exist_ok=True)
    
    # 运行分析脚本
    print("\n1. 运行数据分析和模型训练...")
    try:
        subprocess.run([sys.executable, 'analyze_completion_rate.py'], check=True)
    except subprocess.CalledProcessError:
        print("分析脚本运行失败，请检查错误信息")
        return False
    
    # 运行结论报告脚本
    print("\n2. 生成结论报告...")
    try:
        subprocess.run([sys.executable, 'conclusion_report.py'], check=True)
    except subprocess.CalledProcessError:
        print("结论报告脚本运行失败，请检查错误信息")
        return False
    
    print("\n" + "="*50)
    print("分析完成！所有结果已保存到 'output' 目录")
    print("="*50)
    
    return True

def interactive_prediction():
    """交互式预测完成率"""
    print("\n" + "="*50)
    print("完成率预测工具")
    print("="*50)
    
    # 加载模型
    try:
        model = tf.keras.models.load_model('output/completion_rate_model')
        print("模型加载成功")
    except:
        print("无法加载模型，请先运行分析")
        return
    
    # 加载数据以获取标准化器
    data = pd.read_csv('data/completion_data.csv')
    X = data[['day_of_week', 'is_holiday', 'planned_tasks']]
    scaler = StandardScaler()
    scaler.fit(X)
    
    while True:
        print("\n请输入预测参数（输入'q'退出）：")
        
        # 获取星期几
        day_input = input("星期几 (1-7，1=周一，7=周日): ")
        if day_input.lower() == 'q':
            break
        try:
            day_of_week = int(day_input)
            if day_of_week < 1 or day_of_week > 7:
                print("错误：星期几必须在1-7之间")
                continue
        except:
            print("错误：请输入有效的数字")
            continue
        
        # 获取是否假日
        holiday_input = input("是否假日 (0=否，1=是): ")
        if holiday_input.lower() == 'q':
            break
        try:
            is_holiday = int(holiday_input)
            if is_holiday not in [0, 1]:
                print("错误：是否假日必须是0或1")
                continue
        except:
            print("错误：请输入有效的数字")
            continue
        
        # 获取计划任务数量
        tasks_input = input("计划任务数量: ")
        if tasks_input.lower() == 'q':
            break
        try:
            planned_tasks = int(tasks_input)
            if planned_tasks < 1:
                print("错误：计划任务数量必须大于0")
                continue
        except:
            print("错误：请输入有效的数字")
            continue
        
        # 创建输入数据
        input_data = np.array([[day_of_week, is_holiday, planned_tasks]])
        
        # 标准化输入数据
        input_data_scaled = scaler.transform(input_data)
        
        # 预测完成率
        predicted_rate = model.predict(input_data_scaled)[0][0]
        
        print(f"\n预测结果：")
        print(f"星期{day_of_week}，{'是' if is_holiday else '不是'}假日，计划任务数量为{planned_tasks}")
        print(f"预测完成率: {predicted_rate:.4f} ({predicted_rate*100:.2f}%)")
        
        # 提供一些建议
        if predicted_rate < 0.8:
            print("\n建议：")
            if planned_tasks > 9:
                print("- 考虑减少计划任务数量，建议控制在7-9个任务")
            if day_of_week in [1, 6, 7]:
                print("- 在周一或周末，可能需要额外的专注度和动力")
            if is_holiday == 1:
                print("- 在假日期间，可以设置更明确的目标和奖励机制")
        
        print("\n" + "-"*50)

def main():
    """主函数"""
    if not check_dependencies():
        return
    
    while True:
        print("\n请选择操作：")
        print("1. 运行完整分析")
        print("2. 预测完成率")
        print("3. 退出")
        
        choice = input("\n请输入选项 (1-3): ")
        
        if choice == '1':
            run_analysis()
        elif choice == '2':
            interactive_prediction()
        elif choice == '3':
            print("\n感谢使用！再见！")
            break
        else:
            print("\n无效的选项，请重新输入")

if __name__ == "__main__":
    main()